# 对加工图的处理类(数据清洗，提供有效信息)
# 从加工图中挖掘可用信息
# 对Data数据进行处理
import copy
import B_Data

class Load_Process_Map_Me:
    # 获取相关属性信息，构造精简数据集
    #
    def __init__(self):  # 这里注入订单
        # 基础数据集注入（构件类型、资源、订单）
        self.Component_Types_Details = B_Data.Component_type
        self.Resource_Details = B_Data.Resource
        self.Order_Details = B_Data.Order1

        # 基本数据（构件类型、生产线开放、资源类型）
        self.Components = [[] for _ in range(3)]  # 三维数组 [ [构件编号],[构件型号].[工序个数] ] (1：基本信息提取， 2：为构造 PC_DS 服务)
        self.Line_Type_Opens = [[] for _ in range(2)]  # 二维数组 [[产线编号], [产线索引]] 保存开放生产线编号
        self.Resource_Types = ['Mould', 'Worker']  # 目前自定义
        # 拓展信息（资源数量）
        self.Resource_Total = 0

        # 高级数据 --> 初始化公共基础数据集（构件  资源  基础信息）
        self.PC_DS = {}
        self.Resource_DS = {}
        # 辅助数据
        self.PC_Line = {}  # 构件-生产线对。1：对应关系，2：生产顺序（同一生产线工位占用对构件工序使用的影响），3：解码依据
        self.Base_DataStructure = {}  # 涉及后面的进化环境

        # 初始化各个属性
        self.Get_Info_Base()
        # 初始化高级数据
        self.PC_DS_Initial()
        self.Resource_DS_Initial()
        self.PC_Line_Initial()

    ########################################################################################################################
    # 初始化各属性
    def Get_Info_Base(self):
        # 构件
        for Code in self.Order_Details:
            self.Components[0].append(Code)  # 构件编号
            self.Components[1].append(self.Order_Details[Code])  # 构件类型
            self.Components[2].append(len(self.Component_Types_Details[self.Order_Details[Code]]['Process_Time']))  # 构件工序个数
        # 生产线
        Line_Codes = self.Resource_Details["Line"]["Code"]
        Line_Opens = self.Resource_Details["Line"]["Open"]
        for i in range(len(Line_Opens)):
            if (Line_Opens[i] != 0):  # 生产线开放
                self.Line_Type_Opens[0].append(Line_Codes[i])
                self.Line_Type_Opens[1].append(i)
        # 资源个数
        self.Resource_Total = len(self.Resource_Types)
        # 构件产线对应关系

    ########################################################################################################################
    # 核心数据结构PC_DS （确定工序个数后，统一采用append单个添加，或者数组赋值）
    def PC_DS_Initial(self):
        for i in range(len(self.Components[0])):
            PC_Code = self.Components[0][i]  # 构件编号
            PC_Type = self.Components[1][i]  # 构件型号
            self.PC_DS[PC_Code] = [[] for _ in range(3+len(self.Resource_Types))]  # 长度为工序个数，
            for j in range(len(self.Resource_Types)):
                self.PC_DS[PC_Code][3+j] = self.Component_Types_Details[PC_Type][self.Resource_Types[j]]
                self.PC_DS[PC_Code][3+j] = self.Component_Types_Details[PC_Type][self.Resource_Types[j]]
        return self.PC_DS

    def Resource_DS_Initial(self):
        for Resource_Type in self.Resource_Types:
            Codes = self.Resource_Details[Resource_Type]['Code']  # 某一资源的编号
            Numbers = self.Resource_Details[Resource_Type]['Number']  # 某一资源的数量
            for i in range(len(Codes)):  # i 编号下标和数量下标对应
                self.Resource_DS[Codes[i]] = [0] * Numbers[i]
        return self.Resource_DS
    def PC_Line_Initial(self):
        for line in self.Line_Type_Opens[0]:
            self.PC_Line[line] = []  # 1:从0开始标记，2：采用append添加元素，添加构件编号
        return self.PC_Line

    # <<<< 采用深拷贝函数返回，每次都是新的数据结构 >>>>
    def Get_PC_DS(self):  # 深拷贝（不用Reset部分内容）
        return copy.deepcopy(self.PC_DS)
    def Get_Resource_DS(self):  # 深拷贝（不用Reset部分内容）
        return copy.deepcopy(self.Resource_DS)
    def Get_PC_Line(self):  # 深拷贝（不用Reset部分内容）
        return copy.deepcopy(self.PC_Line)

    def Base_DataStructure_Initial(self):
        pass

if __name__ == "__main__":
    a = {
        'a': 1,
        'b': 2,
    }
    for key in a:
        print(key)

